package com.ross.web.util;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;

import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

import org.apache.log4j.Level;

/**
 * @author Dennis A. Bugayong
 */

public class Encrypter {

    Cipher ecipher;
	Cipher dcipher;

	byte[] salt = {(byte) 0xA9, (byte) 0x9B, (byte) 0xC8, (byte) 0x32, (byte) 0x56, (byte) 0x35, (byte) 0xE3, (byte) 0x03};

	int iterationCount = 19;

	public Encrypter() {
		try {
			String passPhrase = "gPi+lksKVhI/KJYXYn5jnQ==";
			KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
			SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
			ecipher = Cipher.getInstance(key.getAlgorithm());
			dcipher = Cipher.getInstance(key.getAlgorithm());
			AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
			ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
			dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
		} 
		catch (java.security.InvalidAlgorithmParameterException e) {
			AppLogger.log(this,Level.INFO,"",e);
		} 
		catch (java.security.spec.InvalidKeySpecException e) {
			AppLogger.log(this,Level.INFO,"",e);
		} 
		catch (javax.crypto.NoSuchPaddingException e) {
			AppLogger.log(this,Level.INFO,"",e);
		} 
		catch (java.security.NoSuchAlgorithmException e) {
			AppLogger.log(this,Level.INFO,"",e);
		} 
		catch (java.security.InvalidKeyException e) {
			AppLogger.log(this,Level.INFO,"",e);
		}
	}

	public String encrypt(String str) {
		try {
			byte[] utf8 = str.getBytes("UTF8");
			byte[] enc = ecipher.doFinal(utf8);
			return new sun.misc.BASE64Encoder().encode(enc);
		}
		catch (javax.crypto.BadPaddingException e) {
			AppLogger.log(this,Level.INFO,"",e);
		} 
		catch (IllegalBlockSizeException e) {
			AppLogger.log(this,Level.INFO,"",e);
		} 
		catch (UnsupportedEncodingException e) {
			AppLogger.log(this,Level.INFO,"",e);
		}
		return null;
	}

	public String decrypt(String str) {
		try {
			byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
			byte[] utf8 = dcipher.doFinal(dec);
			return new String(utf8, "UTF8");
		}
		catch (javax.crypto.BadPaddingException e) {
			AppLogger.log(this,Level.INFO,"",e);
		} 
		catch (IllegalBlockSizeException e) {
			AppLogger.log(this,Level.INFO,"",e);
		} 
		catch (UnsupportedEncodingException e) {
			AppLogger.log(this,Level.INFO,"",e);
		} 
		catch (java.io.IOException e) {
		}
		return null;
	}

	
	public static void main(String args[]){
		
		Encrypter e = new Encrypter();
		
		System.out.println("database_url="+e.encrypt("jdbc:mysql://localhost:3306/storeko"));
		System.out.println("username="+e.encrypt("root"));
		System.out.println("password="+e.encrypt("admin"));
		
		System.out.println("decrypted url="+e.decrypt("K0fnmPaZv6CayswuZqkcsA=="));
			
	}
	
	
	    
	
	
}
